void main(List<String> args) {
  // 1.创建Person对象
  var p = new Person.withNameAgeHeight("gaolei", 18, 1.88);

  // 默认情况下，所有的类都继承Object
  print(p.toString());
  //2. 知识点 Object和dynamic区别
  // 默认情况下，所有的类都继承Object
  // 父类引用指向子类对象
  // Object和dynamic
  // Object调用方法时候，编译会报错
  // dynamic调用方法的时候，编译不报错，但是运行时候存在安全隐患

  // Object obj = "gaolei";
  // print(obj.substring(1));  报错

  // 类型推导
  // var obj2 = 'gaolei';
  //明确声明
  dynamic obj = 'gaolei';
  print(obj.substring(1));

  var p1 = Person.fromMap({"name": "gaolei", "age": 18, "height": 1.88});
  print(p1);
}

class Person {
  // 默认构造函数
  late String name;
  late int age;
  double height = 0.00;

  // 构造函数语法糖
  // 提供height字段的非空默认值，默认值是0.0 , height是可选值
  Person(this.name, this.age, {this.height = 0.00});

  // Dart中没有重载
  // Person(this.name, this.age, this.height);

  // 命名构造函数
  // withNameAgeHeight自定义名字
  Person.withNameAgeHeight(this.name, this.age, this.height);
  // dynamic 任意类型
  Person.fromMap(Map<String, dynamic> map) {
    this.name = map["name"];
    this.age = map["age"];
    this.height = map["height"];
  }

  // 重写
  @override
  String toString() {
    return "$name $age $height";
  }
}
